import re
from IPython.display import display, Code, Markdown

def extract_url_and_text(input_text):
    """
    提取用户输入中的 URL 和描述文本。

    参数:
    input_text (str): 用户的输入文本，可能包含 URL 和描述性文本。

    返回:
    tuple: 包含描述性文本和提取到的 URL，如果没有 URL，则返回 (input_text, None)。
    """
    # 使用正则表达式检测 URL
    url_pattern = re.compile(r'(https?://[^\s]+)')
    url_match = url_pattern.search(input_text)

    if url_match:
        # 提取 URL 并将其从原文本中移除
        url = url_match.group(0)
        description = input_text.replace(url, '').strip()  # 去掉 URL 后剩下的文本
        return description, url
    else:
        return input_text, None

def create_message(role, content):
    """
    创建标准的消息格式，包括用户、助手或系统消息。

    参数:
    role (str): 消息的角色，值为 "user"、"assistant" 或 "system"。
    content (str or list): 消息的内容，可以是字符串（文本）或包含文本和图像的数组。

    返回:
    dict: 符合 GPT-4o API 要求的消息格式。
    """
    return {
        "role": role,
        "content": content
    }


def process_user_input(input_text):
    """
    根据用户输入的内容，灵活判断是否包含 URL，并生成对应的消息格式。

    参数:
    input_text (str): 用户的输入文本。

    返回:
    dict: 生成的用户消息，包含文本或图片 URL。
    """
    description, url = extract_url_and_text(input_text)

    if url:
        # 如果检测到 URL，生成带图像链接的消息
        if not description:
            description = "请帮我分析这张图片的内容。"  # 如果没有描述，提供默认描述
        return create_user_message_with_image(description, url)
    else:
        # 否则生成普通的文本消息
        return create_message("user", description)

def create_user_message_with_image(text, image_url):
    """
    创建包含文本和图像链接的用户消息。

    参数:
    text (str): 用户输入的文本内容。
    image_url (str): 图像的 URL 地址。

    返回:
    dict: 包含文本和图像的用户消息。
    """
    return {
        "role": "user",
        "content": [
            {"type": "text", "text": text},
            {"type": "image_url", "image_url": {"url": image_url}}
        ]
    }


def chat_with_DeepSeek(client, messages):
    """
    使用 DeepSeek 模型进行多轮对话的核心函数。

    参数:
    client (OpenAI): 实例化的 OpenAI 客户端。
    messages (list): 包含对话上下文的消息列表，包括用户、助手和系统消息。

    返回:
    str: GPT-4o 模型生成的回复内容。
    """
    response = client.chat.completions.create(
        model="deepseek-chat",  # 使用 deepseek-chat 模型
        messages=messages
    )

    # 提取并返回助手生成的回复内容
    return response.choices[0].message.content


def multi_round_chat(client):
    """
    多轮对话机器人示例函数，演示如何通过捕获用户输入，并根据是否包含 URL 做出响应。

    """
    # 初始化消息列表，包含系统消息
    messages = []

    # 创建系统消息，设置对话的上下文
    system_message = create_message("system", "You are a helpful assistant.")
    messages.append(system_message)

    while True:
        # 捕获用户输入
        user_input = input("User: ")

        # 处理用户输入并生成相应的消息
        user_message = process_user_input(user_input)
        messages.append(user_message)

        # 调用 GPT-4o 模型进行回复
        assistant_reply = chat_with_DeepSeek(client, messages)
        display(Markdown(f"Assistant: {assistant_reply}").data)

        # 将助手回复添加到消息列表
        messages.append(create_message("assistant", assistant_reply))

        # 提供退出机制，用户可以输入 'exit' 退出对话
        if user_input.lower() == 'exit':
            print("对话结束。")
            break